home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 14 / CU Amiga Magazine's Super CD-ROM 14 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-09].iso / CUCD / Programming / IEditor / gadgets2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-17  |  42.2 KB  |  1,950 lines

  1. /// Include
  2. #include <stdarg.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7.  
  8. #define INTUI_V36_NAMES_ONLY
  9. #define ASL_V38_NAMES_ONLY
  10. #define CATCOMP_NUMBERS
  11.  
  12. #include <exec/nodes.h>                 // exec
  13. #include <exec/lists.h>
  14. #include <exec/memory.h>
  15. #include <exec/types.h>
  16. #include <intuition/intuition.h>        // intuition
  17. #include <libraries/gadtools.h>         // libraries
  18. #include <libraries/reqtools.h>
  19. #include <clib/exec_protos.h>           // protos
  20. #include <clib/intuition_protos.h>
  21. #include <clib/graphics_protos.h>
  22. #include <clib/dos_protos.h>
  23. #include <clib/locale_protos.h>
  24. #include <clib/gadtools_protos.h>
  25. #include <clib/reqtools_protos.h>
  26. #include <pragmas/exec_pragmas.h>       // pragmas
  27. #include <pragmas/intuition_pragmas.h>
  28. #include <pragmas/graphics_pragmas.h>
  29. #include <pragmas/dos_pragmas.h>
  30. #include <pragmas/locale_pragmas.h>
  31. #include <pragmas/gadtools_pragmas.h>
  32. #include <pragmas/reqtools_pragmas.h>
  33.  
  34.  
  35. #include "DEV_IE:defs.h"
  36. #include "DEV_IE:GUI.h"
  37. #include "DEV_IE:GUI_locale.h"
  38. ///
  39. /// Prototipi
  40. static void     AttaccaTabList( void );
  41. static void     StaccaTabList( void );
  42. static BOOL     SortXGadgets( void );
  43. static BOOL     SortYGadgets( void );
  44. static int      CmpGads( struct GadSort *, struct GadSort * );
  45. static void     Img_AttivaSelRend( void );
  46. static void     Img_AttivaTesto( void );
  47. static void     Img_DisattivaSelRend( void );
  48. static void     Img_DisattivaTesto( void );
  49. static struct GadgetBank *GetGadgetBank( void );
  50. static void     EditGBank( struct GadgetBank * );
  51.  
  52. struct GadSort {
  53.     struct GadgetInfo  *Info;
  54.     WORD                Weight;
  55. };
  56. ///
  57. /// Dati
  58. struct MinList  TabOrder_List;
  59.  
  60. static struct GadSort *SortArray;
  61.  
  62. static UWORD InSort;
  63.  
  64. static ULONG IntReq_tags[] = {
  65.         RT_Screen, 0, RT_ReqPos, REQPOS_CENTERSCR,
  66.         RTGL_Min, 0, RTGL_Max, 1000,
  67.         RTGL_ShowDefault, -1,
  68.         TAG_END
  69.     };
  70.  
  71. struct Node NoneNode = { NULL, NULL, 0, 0, "(---)" };
  72.  
  73. UBYTE DrawModes[] = { JAM1, JAM2, COMPLEMENT };
  74.  
  75. static UWORD GadgetFlags[] = { GFLG_GADGHNONE, GFLG_GADGHCOMP,
  76.                    GFLG_GADGHBOX, GFLG_GADGHIMAGE };
  77. ///
  78.  
  79.  
  80. //          Varie
  81. /// Get Node Num
  82. ULONG GetNodeNum( APTR list, APTR node )
  83. {
  84.     ULONG           num = 0;
  85.     struct Node    *n2;
  86.  
  87.     n2 = ((struct List *)list)->lh_Head;
  88.  
  89.     while( n2 != node ) {
  90.     n2 = n2->ln_Succ;
  91.     num++;
  92.     }
  93.  
  94.     return( num );
  95. }
  96. ///
  97.  
  98. //          Gadgets In Generale
  99. /// CheckActivationKey
  100. BOOL CheckActivationKey( struct WindowInfo *wnd, struct GadgetInfo *gad )
  101. {
  102.     struct GadgetInfo  *g;
  103.  
  104.     if(( gad->g_Kind == BOOLEAN ) || ( gad->g_Key == '\0' ))
  105.     return( FALSE );
  106.  
  107.     for( g = wnd->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ )
  108.     if(( g != gad ) && ( g->g_Kind != BOOLEAN ) && ( g->g_Key == gad->g_Key ))
  109.         return( TRUE );
  110.  
  111.     return( FALSE );
  112. }
  113. ///
  114. /// TabCycle Order
  115. BOOL TabOrderMenued( void )
  116. {
  117.     int                 ret;
  118.     struct GadgetInfo  *gad;
  119.  
  120.     LockAllWindows();
  121.  
  122.     if( IE.win_info->wi_GadTypes[ INTEGER_KIND - 1 ] + IE.win_info->wi_GadTypes[ STRING_KIND - 1 ]) {
  123.  
  124.     NewList((struct List *)&TabOrder_List );
  125.  
  126.     buffer = 0;
  127.  
  128.     for( gad = IE.win_info->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ ) {
  129.         if(( gad->g_Kind == INTEGER_KIND ) || ( gad->g_Kind == STRING_KIND )) {
  130.         buffer += 1;
  131.         Remove((struct Node *)gad );
  132.         AddTail((struct List *)&TabOrder_List, (struct Node *)gad );
  133.         gad->g_Node.ln_Name = gad->g_Label;
  134.         gad = IE.win_info->wi_Gadgets.mlh_Head;
  135.         }
  136.     }
  137.  
  138.     LayoutWindow( TabCycleWTags );
  139.     ret = OpenTabCycleWindow();
  140.     PostOpenWindow( TabCycleWTags );
  141.  
  142.     if( ret )
  143.         DisplayBeep( Scr );
  144.     else {
  145.  
  146.         List2Tag[1] = 0;
  147.         AttaccaTabList();
  148.  
  149.         buffer2 = TabOrder_List.mlh_Head;
  150.  
  151.         while( ReqHandle( TabCycleWnd, HandleTabCycleIDCMP ));
  152.     }
  153.  
  154.     while( gad = RemHead((struct List *)&TabOrder_List ))
  155.         AddTail((struct List *)&IE.win_info->wi_Gadgets, (struct Node *)gad );
  156.  
  157.     CloseTabCycleWindow();
  158.  
  159.     RifaiGadgets();
  160.     }
  161.  
  162.     UnlockAllWindows();
  163.  
  164.     return( TRUE );
  165. }
  166.  
  167. void AttaccaTabList( void )
  168. {
  169.     ListTag[1] = &TabOrder_List;
  170.     GT_SetGadgetAttrsA( TabCycleGadgets[ GD_TC_Gadgets ], TabCycleWnd,
  171.             NULL, (struct TagItem *)ListTag );
  172.     GT_SetGadgetAttrsA( TabCycleGadgets[ GD_TC_Gadgets ], TabCycleWnd,
  173.             NULL, (struct TagItem *)List2Tag );
  174. }
  175.  
  176. void StaccaTabList( void )
  177. {
  178.     ListTag[1] = 0L;
  179.     GT_SetGadgetAttrsA( TabCycleGadgets[ GD_TC_Gadgets ], TabCycleWnd,
  180.             NULL, (struct TagItem *)ListTag );
  181. }
  182.  
  183. BOOL TC_GadgetsClicked( void )
  184. {
  185.     struct Node *node;
  186.     int          n;
  187.  
  188.     List2Tag[1] = List2Tag[3] = TabCycleMsg.Code;
  189.  
  190.     node = (struct Node *)&TabOrder_List;
  191.     for( n = 0; n <= TabCycleMsg.Code; n++ )
  192.     node = node->ln_Succ;
  193.  
  194.     buffer2 = node;
  195.  
  196.     return( TRUE );
  197. }
  198.  
  199. BOOL TC_TopClicked( void )
  200. {
  201.  
  202.     StaccaTabList();
  203.  
  204.     Remove((struct Node *)buffer2 );
  205.     AddHead((struct List *)&TabOrder_List, (struct Node *)buffer2 );
  206.     List2Tag[1] = List2Tag[3] = 0;
  207.  
  208.     AttaccaTabList();
  209.  
  210.     return( TRUE );
  211. }
  212.  
  213. BOOL TC_BottomClicked( void )
  214. {
  215.  
  216.     StaccaTabList();
  217.  
  218.     Remove((struct Node *)buffer2 );
  219.     AddTail((struct List *)&TabOrder_List, (struct Node *)buffer2 );
  220.     List2Tag[1] = List2Tag[3] = buffer - 1;
  221.  
  222.     AttaccaTabList();
  223.  
  224.     return( TRUE );
  225. }
  226.  
  227. BOOL TC_UpClicked( void )
  228. {
  229.     if( List2Tag[1] ) {
  230.  
  231.     List2Tag[1] -= 1;
  232.  
  233.     StaccaTabList();
  234.     NodeUp( (APTR)buffer2 );
  235.     AttaccaTabList();
  236.     }
  237.  
  238.     return( TRUE );
  239. }
  240.  
  241. BOOL TC_DownClicked( void )
  242. {
  243.     if( List2Tag[1] < buffer - 1 ) {
  244.  
  245.     List2Tag[1] += 1;
  246.  
  247.     StaccaTabList();
  248.     NodeDown( (APTR)buffer2 );
  249.     AttaccaTabList();
  250.     }
  251.  
  252.     return( TRUE );
  253. }
  254.  
  255. BOOL TabCycleCloseWindow( void )
  256. {
  257.     return( FALSE );
  258. }
  259. ///
  260. /// Ordinamento dei gadgets
  261. int CmpGads( struct GadSort *g1, struct GadSort *g2 )
  262. {
  263.     return( g1->Weight - g2->Weight );
  264. }
  265.  
  266. BOOL SortXGadgets( void )
  267. {
  268.     BOOL                ret = TRUE;
  269.     struct GadgetInfo  *gad;
  270.     int                 i;
  271.  
  272.     InSort = 0;
  273.  
  274.     for( gad = IE.win_info->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ )
  275.     if( gad->g_flags2 & G_ATTIVO )
  276.         InSort += 1;
  277.  
  278.     if( InSort ) {
  279.  
  280.     if( SortArray = AllocVec( InSort * sizeof( struct GadSort ), 0L )) {
  281.  
  282.         i = 0;
  283.         for( gad = IE.win_info->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ ) {
  284.         if( gad->g_flags2 & G_ATTIVO ) {
  285.             SortArray[ i ].Info   = gad;
  286.             SortArray[ i ].Weight = gad->g_Left;
  287.             i += 1;
  288.         }
  289.         }
  290.  
  291.         qsort( SortArray, InSort, sizeof( struct GadSort ), CmpGads );
  292.  
  293.     } else {
  294.  
  295.         Stat( CatCompArray[ ERR_NOMEMORY ].cca_Str, TRUE, 0 );
  296.         ret = FALSE;
  297.  
  298.     }
  299.  
  300.     }
  301.  
  302.     return( ret );
  303. }
  304.  
  305. BOOL SortYGadgets( void )
  306. {
  307.     BOOL                ret = TRUE;
  308.     struct GadgetInfo  *gad;
  309.     int                 i;
  310.  
  311.     InSort = 0;
  312.  
  313.     for( gad = IE.win_info->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ ) {
  314.     if( gad->g_flags2 & G_ATTIVO ) {
  315.  
  316.         InSort++;
  317.  
  318.     }
  319.     }
  320.  
  321.     if( InSort ) {
  322.  
  323.     if( SortArray = AllocVec( InSort * sizeof( struct GadSort ), 0L )) {
  324.  
  325.         i = 0;
  326.  
  327.         for( gad = IE.win_info->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ ) {
  328.         if( gad->g_flags2 & G_ATTIVO ) {
  329.             SortArray[ i ].Info   = gad;
  330.             SortArray[ i ].Weight = gad->g_Top;
  331.             i += 1;
  332.         }
  333.         }
  334.  
  335.         qsort( SortArray, InSort, sizeof( struct GadSort ), CmpGads );
  336.  
  337.     } else {
  338.  
  339.         Stat( CatCompArray[ ERR_NOMEMORY ].cca_Str, TRUE, 0 );
  340.         ret = FALSE;
  341.  
  342.     }
  343.  
  344.     }
  345.  
  346.     return( ret );
  347. }
  348. ///
  349. /// Spaziatura Gadgets
  350. BOOL XSpaceMenued( void )
  351. {
  352.     ULONG               Space = 4;
  353.     WORD                NewX, i;
  354.     struct GadgetInfo  *gad;
  355.  
  356.     if( TestAttivi() ) {
  357.  
  358.     if( SortXGadgets() ) {
  359.  
  360.         if( InSort > 1 ) {
  361.  
  362.         IntReq_tags[1] = Scr;
  363.  
  364.         if( rtGetLongA( &Space, "X...", NULL, (struct TagItem *)IntReq_tags ) ) {
  365.  
  366.             gad = SortArray[0].Info;
  367.  
  368.             NewX = gad->g_Left + gad->g_Width + Space;
  369.  
  370.             for( i = 1; i < InSort; i++ ) {
  371.             gad = SortArray[ i ].Info;
  372.             gad->g_Left = NewX;
  373.             NewX += ( gad->g_Width + Space );
  374.             }
  375.  
  376.             RifaiGadgets();
  377.             RinfrescaFinestra();
  378.             IE.flags &= ~SALVATO;
  379.  
  380.         } else
  381.             Stat( CatCompArray[ MSG_ABORTED ].cca_Str, FALSE, 0 );
  382.         }
  383.  
  384.         FreeVec( SortArray );
  385.     }
  386.     }
  387.  
  388.     return( TRUE );
  389. }
  390.  
  391. BOOL YSpaceMenued( void )
  392. {
  393.     ULONG               Space = 2;
  394.     WORD                NewY, i;
  395.     struct GadgetInfo  *gad;
  396.  
  397.     if( TestAttivi() ) {
  398.  
  399.     if( SortYGadgets() ) {
  400.  
  401.         if( InSort > 1 ) {
  402.  
  403.         IntReq_tags[1] = Scr;
  404.  
  405.         if( rtGetLongA( &Space, "Y...", NULL, (struct TagItem *)IntReq_tags ) ) {
  406.  
  407.             gad = SortArray[0].Info;
  408.  
  409.             NewY = gad->g_Top + gad->g_Height + Space;
  410.  
  411.             for( i = 1; i < InSort; i++ ) {
  412.             gad = SortArray[ i ].Info;
  413.             gad->g_Top = NewY;
  414.             NewY += ( gad->g_Height + Space );
  415.             }
  416.  
  417.             RifaiGadgets();
  418.             RinfrescaFinestra();
  419.             IE.flags &= ~SALVATO;
  420.  
  421.         } else {
  422.             Stat( CatCompArray[ MSG_ABORTED ].cca_Str, FALSE, 0 );
  423.         }
  424.         }
  425.     }
  426.     }
  427.  
  428.     return( TRUE );
  429. }
  430. ///
  431. /// Distribuisci Gadgets
  432. BOOL SpreadVertMenued( void )
  433. {
  434.     struct IntuiMessage    *msg;
  435.     struct Window          *wnd;
  436.     int                     code, clicks = 0;
  437.     ULONG                   class;
  438.     BOOL                    ok = TRUE;
  439.     WORD                    start, end, old, all;
  440.  
  441.     if( TestAttivi() ) {
  442.  
  443.     IE.win_active->Flags |= WFLG_RMBTRAP;
  444.     SetDrMd( IE.win_active->RPort, COMPLEMENT );
  445.  
  446.     old = IE.win_active->MouseY;
  447.  
  448.     Move( IE.win_active->RPort, IE.win_active->BorderLeft + 1, old );
  449.     Draw( IE.win_active->RPort, IE.win_active->Width - IE.win_active->BorderRight - 1, old );
  450.  
  451.     do {
  452.  
  453.         WaitPort( IE.win_active->UserPort );
  454.  
  455.         while( msg = GT_GetIMsg( IE.win_active->UserPort )) {
  456.  
  457.         class = msg->Class;
  458.         code  = msg->Code;
  459.         wnd   = msg->IDCMPWindow;
  460.  
  461.         GT_ReplyIMsg( msg );
  462.  
  463.         if( wnd == IE.win_active ) {
  464.  
  465.             end = wnd->MouseY;
  466.  
  467.             switch( class ) {
  468.  
  469.             case IDCMP_VANILLAKEY:
  470.                 if( code == 27 ) {
  471.                 ok = FALSE;
  472.                 clicks = 3;
  473.                 }
  474.                 break;
  475.  
  476.             case IDCMP_REFRESHWINDOW:
  477.                 RinfrescaFinestra();
  478.                 break;
  479.  
  480.             case IDCMP_MOUSEBUTTONS:
  481.                 switch( code ) {
  482.                 case 0x69:
  483.                     ok = FALSE;
  484.                     clicks = 3;
  485.                     break;
  486.  
  487.                 case 0x68:
  488.                     if(!( clicks ))
  489.                     start = end;
  490.                     clicks += 1;
  491.                     Move( IE.win_active->RPort, IE.win_active->BorderLeft + 1, old );
  492.                     Draw( IE.win_active->RPort, IE.win_active->Width - IE.win_active->BorderRight - 1, old );
  493.                     break;
  494.                 }
  495.                 break;
  496.  
  497.             case IDCMP_MOUSEMOVE:
  498.                 if( end < IE.win_active->BorderTop ) {
  499.                 end = IE.win_active->BorderTop;
  500.                 } else {
  501.                 if( end >= IE.win_active->Height )
  502.                     end = IE.win_active->Height - 1;
  503.                 }
  504.                 Coord();
  505.                 Move( IE.win_active->RPort, IE.win_active->BorderLeft + 1, old );
  506.                 Draw( IE.win_active->RPort, IE.win_active->Width - IE.win_active->BorderRight - 1, old );
  507.                 old = end;
  508.                 Move( IE.win_active->RPort, IE.win_active->BorderLeft + 1, old );
  509.                 Draw( IE.win_active->RPort, IE.win_active->Width - IE.win_active->BorderRight - 1, old );
  510.                 break;
  511.             }
  512.         }
  513.  
  514.         }
  515.  
  516.     } while( clicks < 2 );
  517.  
  518.     if( ok ) {
  519.  
  520.         if( end < start ) {
  521.         old   = end;
  522.         end   = start;
  523.         start = old;
  524.         }
  525.  
  526.         if( SortYGadgets() ) {
  527.  
  528.         if( InSort > 1 ) {
  529.  
  530.             all = start - 1;
  531.  
  532.             for( old = 0; old < InSort; old++ )
  533.             all += SortArray[ old ].Info->g_Height;
  534.  
  535.             SortArray[ 0 ].Info->g_Top = start;
  536.  
  537.             InSort -= 1;
  538.  
  539.             SortArray[ InSort ].Info->g_Top = end - SortArray[ InSort ].Info->g_Height + 1;
  540.  
  541.             all = ( end - all ) / InSort;
  542.  
  543.             start += ( SortArray[ 0 ].Info->g_Height + all );
  544.  
  545.             for( old = 1; old < InSort; old++ ) {
  546.             SortArray[ old ].Info->g_Top = start;
  547.             start += ( SortArray[ old ].Info->g_Height + all );
  548.             }
  549.  
  550.         } else {
  551.  
  552.             SortArray[0].Info->g_Top = ( start + (( end - start ) >> 1 )) - ( SortArray[0].Info->g_Height >> 1 );
  553.  
  554.         }
  555.  
  556.         FreeVec( SortArray );
  557.  
  558.         RifaiGadgets();
  559.         RinfrescaFinestra();
  560.  
  561.         Stat( CatCompArray[ MSG_DONE ].cca_Str, FALSE, 0 );
  562.         IE.flags &= ~SALVATO;
  563.         }
  564.  
  565.     } else {
  566.         RinfrescaFinestra();
  567.         Stat( CatCompArray[ MSG_ABORTED ].cca_Str, FALSE, 0 );
  568.     }
  569.  
  570.     SetDrMd( IE.win_active->RPort, JAM1 );
  571.     IE.win_active->Flags &= ~WFLG_RMBTRAP;
  572.  
  573.     }
  574.  
  575.     return( TRUE );
  576. }
  577.  
  578. BOOL SpreadHorizMenued( void )
  579. {
  580.     struct IntuiMessage    *msg;
  581.     struct Window          *wnd;
  582.     int                     code, clicks = 0;
  583.     ULONG                   class;
  584.     BOOL                    ok = TRUE;
  585.     WORD                    start, end, old, all;
  586.  
  587.     if( TestAttivi() ) {
  588.  
  589.     IE.win_active->Flags |= WFLG_RMBTRAP;
  590.     SetDrMd( IE.win_active->RPort, COMPLEMENT );
  591.  
  592.     old = IE.win_active->MouseX;
  593.  
  594.     Move( IE.win_active->RPort, old, YOffset + 1 );
  595.     Draw( IE.win_active->RPort, old, IE.win_active->Height - IE.win_active->BorderBottom - 1 );
  596.  
  597.     do {
  598.  
  599.         WaitPort( IE.win_active->UserPort );
  600.  
  601.         while( msg = GT_GetIMsg( IE.win_active->UserPort )) {
  602.  
  603.         class = msg->Class;
  604.         code  = msg->Code;
  605.         wnd   = msg->IDCMPWindow;
  606.  
  607.         GT_ReplyIMsg( msg );
  608.  
  609.         if( wnd == IE.win_active ) {
  610.  
  611.             end = wnd->MouseX;
  612.  
  613.             switch( class ) {
  614.  
  615.             case IDCMP_VANILLAKEY:
  616.                 if( code == 27 ) {
  617.                 ok = FALSE;
  618.                 clicks = 3;
  619.                 }
  620.                 break;
  621.  
  622.             case IDCMP_REFRESHWINDOW:
  623.                 RinfrescaFinestra();
  624.                 break;
  625.  
  626.             case IDCMP_MOUSEBUTTONS:
  627.                 switch( code ) {
  628.                 case 0x69:
  629.                     ok = FALSE;
  630.                     clicks = 3;
  631.                     break;
  632.  
  633.                 case 0x68:
  634.                     if(!( clicks ))
  635.                     start = end;
  636.                     clicks += 1;
  637.                     Move( IE.win_active->RPort, old, YOffset + 1 );
  638.                     Draw( IE.win_active->RPort, old, IE.win_active->Height - IE.win_active->BorderBottom - 1 );
  639.                     break;
  640.                 }
  641.                 break;
  642.  
  643.             case IDCMP_MOUSEMOVE:
  644.                 if( end < 0 ) {
  645.                 end = 0;
  646.                 } else {
  647.                 if( end >= IE.win_active->Width )
  648.                     end = IE.win_active->Width - 1;
  649.                 }
  650.                 Coord();
  651.                 Move( IE.win_active->RPort, old, YOffset + 1 );
  652.                 Draw( IE.win_active->RPort, old, IE.win_active->Height - IE.win_active->BorderBottom - 1 );
  653.                 old = end;
  654.                 Move( IE.win_active->RPort, old, YOffset + 1 );
  655.                 Draw( IE.win_active->RPort, old, IE.win_active->Height - IE.win_active->BorderBottom - 1 );
  656.                 break;
  657.             }
  658.         }
  659.  
  660.         }
  661.  
  662.     } while( clicks < 2 );
  663.  
  664.     if( ok ) {
  665.  
  666.         if( end < start ) {
  667.         old   = end;
  668.         end   = start;
  669.         start = old;
  670.         }
  671.  
  672.         if( SortXGadgets() ) {
  673.  
  674.         if( InSort > 1 ) {
  675.  
  676.             all = start - 1;
  677.  
  678.             for( old = 0; old < InSort; old++ )
  679.             all += SortArray[ old ].Info->g_Width;
  680.  
  681.             SortArray[ 0 ].Info->g_Left = start;
  682.  
  683.             InSort -= 1;
  684.  
  685.             SortArray[ InSort ].Info->g_Left = end - SortArray[ InSort ].Info->g_Width + 1;
  686.  
  687.             all = ( end - all ) / InSort;
  688.  
  689.             start += ( SortArray[ 0 ].Info->g_Width + all );
  690.  
  691.             for( old = 1; old < InSort; old++ ) {
  692.             SortArray[ old ].Info->g_Left = start;
  693.             start += ( SortArray[ old ].Info->g_Width + all );
  694.             }
  695.  
  696.         } else {
  697.  
  698.             SortArray[0].Info->g_Left = ( start + (( end - start ) >> 1 )) - ( SortArray[0].Info->g_Width >> 1 );
  699.  
  700.         }
  701.  
  702.         FreeVec( SortArray );
  703.  
  704.         RifaiGadgets();
  705.         RinfrescaFinestra();
  706.  
  707.         Stat( CatCompArray[ MSG_DONE ].cca_Str, FALSE, 0 );
  708.         IE.flags &= ~SALVATO;
  709.         }
  710.  
  711.     } else {
  712.         RinfrescaFinestra();
  713.         Stat( CatCompArray[ MSG_ABORTED ].cca_Str, FALSE, 0 );
  714.     }
  715.  
  716.     SetDrMd( IE.win_active->RPort, JAM1 );
  717.     IE.win_active->Flags &= ~WFLG_RMBTRAP;
  718.  
  719.     }
  720.  
  721.     return( TRUE );
  722. }
  723. ///
  724.  
  725. //          Gadgets BOOLEANI
  726. /// Aggiungi Booleano
  727. void AggiungiBooleano( void )
  728. {
  729.     struct BooleanInfo  *gad;
  730.     int                  swap;
  731.  
  732.     if( gad = AllocObject( IE_BOOLEAN )) {
  733.  
  734.     gad->b_FrontPen     = 1;
  735.     gad->b_Kind         = BOOLEAN;
  736.  
  737.     ActivateWindow( IE.win_active );
  738.  
  739.     IE.flags &= ~RECTFIXED;
  740.     DrawRect( 0, 0 );
  741.  
  742.     offx = offy = 0;
  743.     Coord();
  744.  
  745.     if( clickx > lastx ) {
  746.         swap = lastx;
  747.         lastx = clickx;
  748.         clickx = swap;
  749.     }
  750.  
  751.     if( clicky > lasty ) {
  752.         swap = lasty;
  753.         lasty = clicky;
  754.         clicky = swap;
  755.     }
  756.  
  757.     gad->b_Left     = clickx;
  758.     gad->b_Top      = clicky;
  759.     gad->b_Width    = ( lastx - clickx ) + 1;
  760.     gad->b_Height   = ( lasty - clicky ) + 1;
  761.  
  762.     CheckSize((struct GadgetInfo *)gad );
  763.  
  764.     ParametriBooleano( gad );
  765.  
  766.     if( buffer ) {
  767.         UBYTE   prefs;
  768.  
  769.         prefs = IE.mainprefs;
  770.  
  771.         if(!( gad->b_Label[0] )) {
  772.         sprintf( gad->b_Label, "%sGad%03ld",
  773.              IE.win_info->wi_Label,
  774.              IE.win_info->wi_NewGadID );
  775.         IE.win_info->wi_NewGadID += 1;
  776.         }
  777.  
  778.         if(!( IE.win_info->wi_NumGads ))
  779.         MenuGadgetAttiva();
  780.  
  781.         IE.win_info->wi_NumGads  += 1;
  782.         IE.win_info->wi_NumBools += 1;
  783.  
  784.         AddTail((struct List *)&IE.win_info->wi_Gadgets, (struct Node *)gad );
  785.  
  786.         if(!( prefs & STACCATI ))
  787.         StaccaGadgets();
  788.  
  789.         SistemaNextBool();
  790.         AttaccaGadgets();
  791.  
  792.         if( prefs & STACCATI ) {
  793.         IE.mainprefs &= ~STACCATI;
  794.         StaccaGadgets();
  795.         IE.mainprefs |= STACCATI;
  796.         }
  797.  
  798.         DisattivaTuttiGad();
  799.  
  800.         gad->b_flags2 |= G_ATTIVO;
  801.  
  802.         RinfrescaFinestra();
  803.  
  804.         IE.flags &= ~SALVATO;
  805.  
  806.         Stat( CatCompArray[ MSG_GAD_ADDED ].cca_Str, FALSE, 0 );
  807.  
  808.     } else {
  809.         FreeObject( gad, IE_BOOLEAN );
  810.         Stat( CatCompArray[ MSG_ABORTED ].cca_Str, FALSE, 0 );
  811.     }
  812.  
  813.     } else {
  814.     Stat( CatCompArray[ ERR_NOMEMORY ].cca_Str, TRUE, 0 );
  815.     }
  816. }
  817. ///
  818. /// Parametri Booleano
  819. void ParametriBooleano( struct BooleanInfo *gad )
  820. {
  821.     ULONG   old_Flags;
  822.     APTR    old_GR, old_SR;
  823.     UBYTE   old_FP, old_BP, old_DM, old_flags2, dm;
  824.     int     ret, cnt;
  825.     UWORD   flg;
  826.     ULONG  *ptr;
  827.  
  828.     old_Flags   = gad->b_Flags;
  829.     old_GR      = gad->b_GadgetRender;
  830.     old_SR      = gad->b_SelectRender;
  831.     old_FP      = gad->b_FrontPen;
  832.     old_BP      = gad->b_BackPen;
  833.     old_DM      = gad->b_DrawMode;
  834.     old_flags2  = gad->b_flags2;
  835.  
  836.     LockAllWindows();
  837.     AddHead(( struct List * )&IE.Img_List, &NoneNode );
  838.  
  839.  
  840.     ptr = ImgButGTags;
  841.  
  842.     while( *ptr++ != GTPA_Depth ) {}
  843.     *ptr++ = IE.ScreenData->Tags[ SCRDEPTH ];
  844.     while( *ptr++ != GTPA_Depth ) {}
  845.     *ptr   = IE.ScreenData->Tags[ SCRDEPTH ];
  846.  
  847.     LayoutWindow( ImgButWTags );
  848.     ret = OpenImgButWindow();
  849.     PostOpenWindow( ImgButWTags );
  850.  
  851.     if(!( ret )) {
  852.  
  853.     IntegerTag[1] = gad->b_Width;
  854.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Width ], ImgButWnd,
  855.                 NULL, (struct TagItem *)IntegerTag );
  856.  
  857.     IntegerTag[1] = gad->b_Height;
  858.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Height ], ImgButWnd,
  859.                 NULL, (struct TagItem *)IntegerTag );
  860.  
  861.     IntegerTag[1] = gad->b_TxtLeft;
  862.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_X ], ImgButWnd,
  863.                 NULL, (struct TagItem *)IntegerTag );
  864.  
  865.     IntegerTag[1] = gad->b_TxtTop;
  866.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Y ], ImgButWnd,
  867.                 NULL, (struct TagItem *)IntegerTag );
  868.  
  869.     StringTag[1] = gad->b_Label;
  870.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Label ], ImgButWnd,
  871.                 NULL, (struct TagItem *)StringTag );
  872.  
  873.     StringTag[1] = gad->b_Titolo;
  874.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Txt ], ImgButWnd,
  875.                 NULL, (struct TagItem *)StringTag );
  876.  
  877.     PaletteTag[1] = gad->b_FrontPen;
  878.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_FP ], ImgButWnd,
  879.                 NULL, (struct TagItem *)PaletteTag );
  880.  
  881.     PaletteTag2[1] = gad->b_BackPen;
  882.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_BP ], ImgButWnd,
  883.                 NULL, (struct TagItem *)PaletteTag2 );
  884.  
  885.     dm = gad->b_DrawMode & ~INVERSVID;
  886.     cnt = 0;
  887.     while( DrawModes[ cnt ] != dm )
  888.         cnt++;
  889.  
  890.     CycleTag[1] = dm;
  891.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_RPMode ], ImgButWnd,
  892.                 NULL, (struct TagItem *)CycleTag );
  893.  
  894.     CheckedTag[1] = ( gad->b_DrawMode & INVERSVID ) ? TRUE : FALSE;
  895.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Invers ], ImgButWnd,
  896.                 NULL, (struct TagItem *)CheckedTag );
  897.  
  898.     CheckedTag[1] = ( gad->b_Flags & GFLG_SELECTED ) ? TRUE : FALSE;
  899.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Sel ], ImgButWnd,
  900.                 NULL, (struct TagItem *)CheckedTag );
  901.  
  902.     CheckedTag[1] = ( gad->b_Flags & GFLG_DISABLED ) ? TRUE : FALSE;
  903.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Disab ], ImgButWnd,
  904.                 NULL, (struct TagItem *)CheckedTag );
  905.  
  906.     CheckedTag[1] = ( gad->b_Activation & GACT_TOGGLESELECT ) ? TRUE : FALSE;
  907.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Toggle ], ImgButWnd,
  908.                 NULL, (struct TagItem *)CheckedTag );
  909.  
  910.     CheckedTag[1] = ( gad->b_Activation & GACT_IMMEDIATE ) ? TRUE : FALSE;
  911.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Immediate ], ImgButWnd,
  912.                 NULL, (struct TagItem *)CheckedTag );
  913.  
  914.     CheckedTag[1] = ( gad->b_Activation & GACT_RELVERIFY ) ? TRUE : FALSE;
  915.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_RelVer ], ImgButWnd,
  916.                 NULL, (struct TagItem *)CheckedTag );
  917.  
  918.     CheckedTag[1] = ( gad->b_Activation & GACT_FOLLOWMOUSE ) ? TRUE : FALSE;
  919.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Follow ], ImgButWnd,
  920.                 NULL, (struct TagItem *)CheckedTag );
  921.  
  922.     flg = gad->b_Flags & ~(GFLG_GADGIMAGE | GFLG_DISABLED | GFLG_SELECTED );
  923.     cnt = 0;
  924.     while( GadgetFlags[ cnt ] != flg )
  925.         cnt++;
  926.  
  927.     MXTag[1] = cnt;
  928.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_High ], ImgButWnd,
  929.                 NULL, (struct TagItem *)MXTag );
  930.  
  931.     if( flg == GFLG_GADGHIMAGE )
  932.         Img_AttivaSelRend();
  933.  
  934.     if( gad->b_flags2 & B_TEXT ) {
  935.         CheckedTag[1] = TRUE;
  936.         GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_ChkTxt ], ImgButWnd,
  937.                 NULL, (struct TagItem *)CheckedTag );
  938.         Img_AttivaTesto();
  939.     }
  940.  
  941.     ListTag[1] = &IE.Img_List;
  942.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_GadRend ], ImgButWnd,
  943.                 NULL, (struct TagItem *)ListTag );
  944.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_SelRend ], ImgButWnd,
  945.                 NULL, (struct TagItem *)ListTag );
  946.  
  947.     if( gad->b_GadgetRender ) {
  948.         List2Tag[1] = List2Tag[3] = GetNodeNum( &IE.Img_List, (APTR)((ULONG)gad->b_GadgetRender - 14 ));
  949.         GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_GadRend ], ImgButWnd,
  950.                 NULL, (struct TagItem *)List2Tag );
  951.     }
  952.  
  953.     if( gad->b_SelectRender ) {
  954.         List2Tag2[1] = List2Tag2[3] = GetNodeNum( &IE.Img_List, (APTR)((ULONG)gad->b_SelectRender - 14 ));
  955.         GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_SelRend ], ImgButWnd,
  956.                 NULL, (struct TagItem *)List2Tag2 );
  957.     }
  958.  
  959.     buffer = FALSE;
  960.     buffer2 = gad;
  961.  
  962.     RetCode = 0;
  963.  
  964.     do {
  965.         ReqHandle( ImgButWnd, HandleImgButIDCMP );
  966.     } while(!( RetCode ));
  967.  
  968.     if( RetCode > 0 ) {
  969.  
  970.         gad->b_Flags        = old_Flags;
  971.         gad->b_flags2       = old_flags2;
  972.         gad->b_FrontPen     = old_FP;
  973.         gad->b_BackPen      = old_BP;
  974.         gad->b_DrawMode     = old_DM;
  975.         gad->b_GadgetRender = old_GR;
  976.         gad->b_SelectRender = old_SR;
  977.  
  978.     } else {
  979.  
  980.         STRPTR label;
  981.  
  982.         label = GetString( ImgButGadgets[ GD_Img_Label ]);
  983.  
  984.         if( label[0] )
  985.         strcpy( gad->b_Label, label );
  986.         strcpy( gad->b_Titolo, GetString( ImgButGadgets[ GD_Img_Txt ]) );
  987.  
  988.         if( gad->b_flags2 & B_TEXT )
  989.         gad->b_Text = gad->b_Titolo;
  990.         else
  991.         gad->b_Text = NULL;
  992.  
  993.         gad->b_Width    = GetNumber( ImgButGadgets[ GD_Img_Width ]);
  994.         gad->b_Height   = GetNumber( ImgButGadgets[ GD_Img_Height ]);
  995.         gad->b_TxtLeft  = GetNumber( ImgButGadgets[ GD_Img_X ]);
  996.         gad->b_TxtTop   = GetNumber( ImgButGadgets[ GD_Img_Y ]);
  997.  
  998.         buffer = TRUE;
  999.     }
  1000.  
  1001.     } else {
  1002.     DisplayBeep( Scr );
  1003.     }
  1004.  
  1005.     CloseImgButWindow();
  1006.  
  1007.     RemHead(( struct List * )&IE.Img_List );
  1008.     UnlockAllWindows();
  1009. }
  1010.  
  1011. BOOL Img_AnnullaKeyPressed( void )
  1012. {
  1013.     RetCode = 1;
  1014. }
  1015.  
  1016. BOOL Img_AnnullaClicked( void )
  1017. {
  1018.     RetCode = 1;
  1019. }
  1020.  
  1021. BOOL Img_OKKeyPressed( void )
  1022. {
  1023.     RetCode = -1;
  1024. }
  1025.  
  1026. BOOL Img_OKClicked( void )
  1027. {
  1028.     RetCode = -1;
  1029. }
  1030.  
  1031. BOOL ImgButVanillaKey( void )
  1032. {
  1033.     switch( ImgButMsg.Code ) {
  1034.     case 13:
  1035.         RetCode = -1;
  1036.         break;
  1037.     case 27:
  1038.         RetCode = 1;
  1039.         break;
  1040.     }
  1041. }
  1042.  
  1043. BOOL Img_WidthClicked( void )
  1044. {
  1045.     ActivateGadget( ImgButGadgets[ GD_Img_Height ], ImgButWnd, NULL );
  1046. }
  1047.  
  1048. BOOL Img_HeightClicked( void )
  1049. {
  1050. }
  1051.  
  1052. BOOL Img_LabelClicked( void )
  1053. {
  1054. }
  1055.  
  1056. BOOL Img_YClicked( void )
  1057. {
  1058. }
  1059.  
  1060. BOOL Img_TxtClicked( void )
  1061. {
  1062.     ActivateGadget( ImgButGadgets[ GD_Img_X ], ImgButWnd, NULL );
  1063. }
  1064.  
  1065. BOOL Img_XClicked( void )
  1066. {
  1067.     ActivateGadget( ImgButGadgets[ GD_Img_Y ], ImgButWnd, NULL );
  1068. }
  1069.  
  1070. BOOL Img_GadRendKeyPressed( void )
  1071. {
  1072.  
  1073.     if( ImgButMsg.Code & 0x20 ) {
  1074.  
  1075.     if( List2Tag[1] < IE.NumImgs )
  1076.         List2Tag[1] += 1;
  1077.     else
  1078.         List2Tag[1] = 0;
  1079.  
  1080.     } else {
  1081.  
  1082.     if( List2Tag[1] )
  1083.         List2Tag[1] -= 1;
  1084.     else
  1085.         List2Tag[1] = IE.NumImgs;
  1086.     }
  1087.  
  1088.     ImgButMsg.Code = List2Tag[3] = List2Tag[1];
  1089.  
  1090.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_GadRend ], ImgButWnd,
  1091.             NULL, (struct TagItem *)List2Tag );
  1092.  
  1093.     Img_GadRendClicked();
  1094. }
  1095.  
  1096. BOOL Img_GadRendClicked( void )
  1097. {
  1098.     struct ImageNode   *img;
  1099.     int                 cnt;
  1100.  
  1101.     List2Tag[1] = List2Tag[3] = ImgButMsg.Code;
  1102.  
  1103.     if( ImgButMsg.Code ) {
  1104.  
  1105.     img = (struct ImageNode *)&IE.Img_List;
  1106.     for( cnt = 0; cnt <= ImgButMsg.Code; cnt++ )
  1107.         img = img->in_Node.ln_Succ;
  1108.  
  1109.     ((struct BooleanInfo *)buffer2)->b_GadgetRender = &img->in_Left;
  1110.     ((struct BooleanInfo *)buffer2)->b_Flags |= GFLG_GADGIMAGE;
  1111.     } else {
  1112.     ((struct BooleanInfo *)buffer2)->b_GadgetRender = NULL;
  1113.     ((struct BooleanInfo *)buffer2)->b_Flags &= ~GFLG_GADGIMAGE;
  1114.     }
  1115. }
  1116.  
  1117. BOOL Img_SelRendKeyPressed( void )
  1118. {
  1119.  
  1120.     if( ImgButMsg.Code & 0x20 ) {
  1121.  
  1122.     if( List2Tag2[1] < IE.NumImgs )
  1123.         List2Tag2[1] += 1;
  1124.     else
  1125.         List2Tag2[1] = 0;
  1126.  
  1127.     } else {
  1128.  
  1129.     if( List2Tag2[1] )
  1130.         List2Tag2[1] -= 1;
  1131.     else
  1132.         List2Tag2[1] = IE.NumImgs;
  1133.     }
  1134.  
  1135.     ImgButMsg.Code = List2Tag2[3] = List2Tag2[1];
  1136.  
  1137.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_SelRend ], ImgButWnd,
  1138.             NULL, (struct TagItem *)List2Tag );
  1139.  
  1140.     Img_SelRendClicked();
  1141. }
  1142.  
  1143. BOOL Img_SelRendClicked( void )
  1144. {
  1145.     struct ImageNode   *img;
  1146.     int                 cnt;
  1147.  
  1148.     List2Tag2[1] = List2Tag2[3] = ImgButMsg.Code;
  1149.  
  1150.     if( ImgButMsg.Code ) {
  1151.  
  1152.     img = (struct ImageNode *)&IE.Img_List;
  1153.     for( cnt = 0; cnt <= ImgButMsg.Code; cnt++ )
  1154.         img = img->in_Node.ln_Succ;
  1155.  
  1156.     ((struct BooleanInfo *)buffer2)->b_SelectRender = &img->in_Left;
  1157.     } else {
  1158.     ((struct BooleanInfo *)buffer2)->b_SelectRender = NULL;
  1159.     }
  1160. }
  1161.  
  1162. BOOL Img_HighKeyPressed( void )
  1163. {
  1164.     if( ImgButMsg.Code & 0x20 ) {
  1165.  
  1166.     if( MXTag[1] < 3 )
  1167.         MXTag[1] += 1;
  1168.     else
  1169.         MXTag[1] = 0;
  1170.  
  1171.     } else {
  1172.  
  1173.     if( MXTag[1] )
  1174.         MXTag[1] -= 1;
  1175.     else
  1176.         MXTag[1] = 3;
  1177.  
  1178.     }
  1179.  
  1180.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_High ], ImgButWnd,
  1181.             NULL, (struct TagItem *)MXTag );
  1182.  
  1183.     ImgButMsg.Code = MXTag[1];
  1184.  
  1185.     Img_HighClicked();
  1186. }
  1187.  
  1188. BOOL Img_HighClicked( void )
  1189. {
  1190.     MXTag[1] = ImgButMsg.Code;
  1191.  
  1192.     ((struct BooleanInfo *)buffer2)->b_Flags = (((struct BooleanInfo *)buffer2)->b_Flags & ( GFLG_GADGIMAGE | GFLG_DISABLED | GFLG_SELECTED ) | GadgetFlags[ ImgButMsg.Code ]);
  1193.  
  1194.     if( ImgButMsg.Code == 3 )
  1195.     Img_AttivaSelRend();
  1196.     else
  1197.     Img_DisattivaSelRend();
  1198. }
  1199.  
  1200. void Img_AttivaSelRend( void )
  1201. {
  1202.     DisableTag[1] = FALSE;
  1203.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_SelRend ], ImgButWnd,
  1204.             NULL, (struct TagItem *)DisableTag );
  1205. }
  1206.  
  1207. void Img_DisattivaSelRend( void )
  1208. {
  1209.     DisableTag[1] = TRUE;
  1210.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_SelRend ], ImgButWnd,
  1211.             NULL, (struct TagItem *)DisableTag );
  1212. }
  1213.  
  1214. BOOL Img_ChkTxtKeyPressed( void )
  1215. {
  1216.     CheckedTag[1] = ( ((struct BooleanInfo *)buffer2)->b_flags2 & B_TEXT ) ? FALSE : TRUE;
  1217.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_ChkTxt ], ImgButWnd,
  1218.             NULL, (struct TagItem *)CheckedTag );
  1219.  
  1220.     return( Img_ChkTxtClicked() );
  1221. }
  1222.  
  1223. BOOL Img_ChkTxtClicked( void )
  1224. {
  1225.     ((struct BooleanInfo *)buffer2)->b_flags2 ^= B_TEXT;
  1226.  
  1227.     if( ((struct BooleanInfo *)buffer2)->b_flags2 & B_TEXT )
  1228.     Img_AttivaTesto();
  1229.     else
  1230.     Img_DisattivaTesto();
  1231. }
  1232.  
  1233. void Img_AttivaTesto( void )
  1234. {
  1235.     DisableTag[1] = FALSE;
  1236.  
  1237.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Txt ], ImgButWnd,
  1238.             NULL, (struct TagItem *)DisableTag );
  1239.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_X ], ImgButWnd,
  1240.             NULL, (struct TagItem *)DisableTag );
  1241.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Y ], ImgButWnd,
  1242.             NULL, (struct TagItem *)DisableTag );
  1243.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Invers ], ImgButWnd,
  1244.             NULL, (struct TagItem *)DisableTag );
  1245.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_RPMode ], ImgButWnd,
  1246.             NULL, (struct TagItem *)DisableTag );
  1247.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_FP ], ImgButWnd,
  1248.             NULL, (struct TagItem *)DisableTag );
  1249.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_BP ], ImgButWnd,
  1250.             NULL, (struct TagItem *)DisableTag );
  1251. }
  1252.  
  1253. void Img_DisattivaTesto( void )
  1254. {
  1255.     DisableTag[1] = TRUE;
  1256.  
  1257.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Txt ], ImgButWnd,
  1258.             NULL, (struct TagItem *)DisableTag );
  1259.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_X ], ImgButWnd,
  1260.             NULL, (struct TagItem *)DisableTag );
  1261.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Y ], ImgButWnd,
  1262.             NULL, (struct TagItem *)DisableTag );
  1263.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Invers ], ImgButWnd,
  1264.             NULL, (struct TagItem *)DisableTag );
  1265.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_RPMode ], ImgButWnd,
  1266.             NULL, (struct TagItem *)DisableTag );
  1267.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_FP ], ImgButWnd,
  1268.             NULL, (struct TagItem *)DisableTag );
  1269.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_BP ], ImgButWnd,
  1270.             NULL, (struct TagItem *)DisableTag );
  1271. }
  1272.  
  1273. BOOL Img_InversKeyPressed( void )
  1274. {
  1275.     CheckedTag[1] = ( ((struct BooleanInfo *)buffer2)->b_DrawMode & INVERSVID ) ? FALSE : TRUE;
  1276.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Invers ], ImgButWnd,
  1277.             NULL, (struct TagItem *)CheckedTag );
  1278.  
  1279.     Img_InversClicked();
  1280. }
  1281.  
  1282. BOOL Img_InversClicked( void )
  1283. {
  1284.     ((struct BooleanInfo *)buffer2)->b_DrawMode ^= INVERSVID;
  1285. }
  1286.  
  1287. BOOL Img_ToggleKeyPressed( void )
  1288. {
  1289.     CheckedTag[1] = ( ((struct BooleanInfo *)buffer2)->b_Activation & GACT_TOGGLESELECT ) ? FALSE : TRUE;
  1290.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Toggle ], ImgButWnd,
  1291.             NULL, (struct TagItem *)CheckedTag );
  1292.  
  1293.     Img_ToggleClicked();
  1294. }
  1295.  
  1296. BOOL Img_ToggleClicked( void )
  1297. {
  1298.     ((struct BooleanInfo *)buffer2)->b_Activation ^= GACT_TOGGLESELECT;
  1299. }
  1300.  
  1301. BOOL Img_ImmediateKeyPressed( void )
  1302. {
  1303.     CheckedTag[1] = ( ((struct BooleanInfo *)buffer2)->b_Activation & GACT_IMMEDIATE ) ? FALSE : TRUE;
  1304.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Immediate ], ImgButWnd,
  1305.             NULL, (struct TagItem *)CheckedTag );
  1306.  
  1307.     Img_ImmediateClicked();
  1308. }
  1309.  
  1310. BOOL Img_ImmediateClicked( void )
  1311. {
  1312.     ((struct BooleanInfo *)buffer2)->b_Activation ^= GACT_IMMEDIATE;
  1313. }
  1314.  
  1315. BOOL Img_RelVerKeyPressed( void )
  1316. {
  1317.     CheckedTag[1] = ( ((struct BooleanInfo *)buffer2)->b_Activation & GACT_RELVERIFY ) ? FALSE : TRUE;
  1318.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_RelVer ], ImgButWnd,
  1319.             NULL, (struct TagItem *)CheckedTag );
  1320.  
  1321.     Img_RelVerClicked();
  1322. }
  1323.  
  1324. BOOL Img_RelVerClicked( void )
  1325. {
  1326.     ((struct BooleanInfo *)buffer2)->b_Activation ^= GACT_RELVERIFY;
  1327. }
  1328.  
  1329. BOOL Img_FollowKeyPressed( void )
  1330. {
  1331.     CheckedTag[1] = ( ((struct BooleanInfo *)buffer2)->b_Activation & GACT_FOLLOWMOUSE ) ? FALSE : TRUE;
  1332.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Follow ], ImgButWnd,
  1333.             NULL, (struct TagItem *)CheckedTag );
  1334.  
  1335.     Img_FollowClicked();
  1336. }
  1337.  
  1338. BOOL Img_FollowClicked( void )
  1339. {
  1340.     ((struct BooleanInfo *)buffer2)->b_Activation ^= GACT_FOLLOWMOUSE;
  1341. }
  1342.  
  1343. BOOL Img_SelKeyPressed( void )
  1344. {
  1345.     CheckedTag[1] = ( ((struct BooleanInfo *)buffer2)->b_Flags & GFLG_SELECTED ) ? FALSE : TRUE;
  1346.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Sel ], ImgButWnd,
  1347.             NULL, (struct TagItem *)CheckedTag );
  1348.  
  1349.     Img_SelClicked();
  1350. }
  1351.  
  1352. BOOL Img_SelClicked( void )
  1353. {
  1354.     ((struct BooleanInfo *)buffer2)->b_Flags ^= GFLG_SELECTED;
  1355. }
  1356.  
  1357. BOOL Img_DisabKeyPressed( void )
  1358. {
  1359.     CheckedTag[1] = ( ((struct BooleanInfo *)buffer2)->b_Flags & GFLG_DISABLED ) ? FALSE : TRUE;
  1360.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Disab ], ImgButWnd,
  1361.             NULL, (struct TagItem *)CheckedTag );
  1362.  
  1363.     Img_DisabClicked();
  1364. }
  1365.  
  1366. BOOL Img_DisabClicked( void )
  1367. {
  1368.     ((struct BooleanInfo *)buffer2)->b_Flags ^= GFLG_DISABLED;
  1369. }
  1370.  
  1371. BOOL Img_RPModeKeyPressed( void )
  1372. {
  1373.     if( ImgButMsg.Code & 0x20 ) {
  1374.  
  1375.     if( CycleTag[1] < 2 )
  1376.         CycleTag[1] += 1;
  1377.     else
  1378.         CycleTag[1] = 0;
  1379.  
  1380.     } else {
  1381.  
  1382.     if( CycleTag[1] )
  1383.         CycleTag[1] -= 1;
  1384.     else
  1385.         CycleTag[1] = 2;
  1386.  
  1387.     }
  1388.  
  1389.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_RPMode ], ImgButWnd,
  1390.             NULL, (struct TagItem *)CycleTag );
  1391.  
  1392.     ImgButMsg.Code = CycleTag[1];
  1393.  
  1394.     Img_RPModeClicked();
  1395. }
  1396.  
  1397. BOOL Img_RPModeClicked( void )
  1398. {
  1399.     CycleTag[1] = ImgButMsg.Code;
  1400.  
  1401.     ((struct BooleanInfo *)buffer2)->b_DrawMode = ( ((struct BooleanInfo *)buffer2)->b_DrawMode & INVERSVID ) | DrawModes[ ImgButMsg.Code ];
  1402. }
  1403.  
  1404. BOOL Img_FPKeyPressed( void )
  1405. {
  1406.     if( ImgButMsg.Code & 0x20 ) {
  1407.  
  1408.     if( PaletteTag[1] < ( 1 << IE.ScreenData->Tags[ SCRDEPTH ]) - 1 )
  1409.         PaletteTag[1] += 1;
  1410.     else
  1411.         PaletteTag[1] = 0;
  1412.  
  1413.     } else {
  1414.  
  1415.     if( PaletteTag[1] )
  1416.         PaletteTag[1] -= 1;
  1417.     else
  1418.         PaletteTag[1] = ( 1 << IE.ScreenData->Tags[ SCRDEPTH ]) - 1;
  1419.  
  1420.     }
  1421.  
  1422.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_FP ], ImgButWnd,
  1423.             NULL, (struct TagItem *)PaletteTag );
  1424.  
  1425.     ImgButMsg.Code = PaletteTag[1];
  1426.  
  1427.     Img_FPClicked();
  1428. }
  1429.  
  1430. BOOL Img_FPClicked( void )
  1431. {
  1432.     PaletteTag[1] = ((struct BooleanInfo *)buffer2)->b_FrontPen = ImgButMsg.Code;
  1433. }
  1434.  
  1435. BOOL Img_BPKeyPressed( void )
  1436. {
  1437.     if( ImgButMsg.Code & 0x20 ) {
  1438.  
  1439.     if( PaletteTag2[1] < ( 1 << IE.ScreenData->Tags[ SCRDEPTH ]) - 1 )
  1440.         PaletteTag2[1] += 1;
  1441.     else
  1442.         PaletteTag2[1] = 0;
  1443.  
  1444.     } else {
  1445.  
  1446.     if( PaletteTag2[1] )
  1447.         PaletteTag2[1] -= 1;
  1448.     else
  1449.         PaletteTag2[1] = ( 1 << IE.ScreenData->Tags[ SCRDEPTH ]) - 1;
  1450.  
  1451.     }
  1452.  
  1453.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_BP ], ImgButWnd,
  1454.             NULL, (struct TagItem *)PaletteTag2 );
  1455.  
  1456.     ImgButMsg.Code = PaletteTag2[1];
  1457.  
  1458.     Img_BPClicked();
  1459. }
  1460.  
  1461. BOOL Img_BPClicked( void )
  1462. {
  1463.     PaletteTag2[1] = ((struct BooleanInfo *)buffer2)->b_BackPen = ImgButMsg.Code;
  1464. }
  1465.  
  1466. BOOL Img_SameKeyPressed( void )
  1467. {
  1468.     Img_SameClicked();
  1469. }
  1470.  
  1471. BOOL Img_SameClicked( void )
  1472. {
  1473.     if( ((struct BooleanInfo *)buffer2)->b_GadgetRender ) {
  1474.  
  1475.     IntegerTag[1] = ((struct BooleanInfo *)buffer2)->b_GadgetRender->Width;
  1476.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Width ], ImgButWnd,
  1477.                 NULL, (struct TagItem *)IntegerTag );
  1478.  
  1479.     IntegerTag[1] = ((struct BooleanInfo *)buffer2)->b_GadgetRender->Height;
  1480.     GT_SetGadgetAttrsA( ImgButGadgets[ GD_Img_Height ], ImgButWnd,
  1481.                 NULL, (struct TagItem *)IntegerTag );
  1482.     }
  1483. }
  1484. ///
  1485. /// Accoda Booleani
  1486. void AccodaBooleani( void )
  1487. {
  1488.     struct BooleanInfo *gad;
  1489.     struct WindowInfo  *wnd;
  1490.  
  1491.     NewList((struct List *)&TabOrder_List );
  1492.  
  1493.     for( wnd = IE.win_list.mlh_Head; wnd->wi_succ; wnd = wnd->wi_succ ) {
  1494.     if( wnd->wi_NumBools ) {
  1495.  
  1496.         for(;;) {
  1497.         gad = wnd->wi_Gadgets.mlh_Head;
  1498.         while(( gad->b_Node.ln_Succ ) && ( gad->b_Kind != BOOLEAN ))
  1499.             gad = gad->b_Node.ln_Succ;
  1500.  
  1501.         if( gad->b_Node.ln_Succ ) {
  1502.             Remove((struct Node *)gad );
  1503.             AddTail((struct List *)&TabOrder_List, (struct Node *)gad );
  1504.         } else
  1505.             break;
  1506.         }
  1507.  
  1508.         while( gad = RemHead((struct List *)&TabOrder_List ))
  1509.         AddTail((struct List *)&wnd->wi_Gadgets, (struct Node *)gad );
  1510.     }
  1511.     }
  1512. }
  1513. ///
  1514. /// SistemaNextBool
  1515. void SistemaNextBool( void )
  1516. {
  1517.     struct BooleanInfo     *gad, *gad2;
  1518.  
  1519.     if( IE.win_info->wi_NumBools ) {
  1520.  
  1521.     gad = IE.win_info->wi_Gadgets.mlh_Head;
  1522.     while( gad->b_Kind != BOOLEAN )
  1523.         gad = gad->b_Node.ln_Succ;
  1524.  
  1525.     for( gad2 = gad->b_Node.ln_Succ; gad2->b_Node.ln_Succ; gad2 = gad2->b_Node.ln_Succ ) {
  1526.         if( gad2->b_Kind == BOOLEAN ) {
  1527.         gad->b_NextGadget = &gad2->b_NextGadget;
  1528.         gad  = gad2;
  1529.         }
  1530.     }
  1531.  
  1532.     gad = IE.win_info->wi_Gadgets.mlh_TailPred;
  1533.     while( gad->b_Kind != BOOLEAN )
  1534.         gad = gad->b_Node.ln_Pred;
  1535.     gad->b_NextGadget = IE.win_info->wi_GList;
  1536.     }
  1537. }
  1538. ///
  1539.  
  1540. //          Banchi di gadget
  1541. /// Crea
  1542. BOOL MakeGBankMenued( void )
  1543. {
  1544.     struct GadgetBank  *bank;
  1545.  
  1546.     if( TestAttivi() ) {
  1547.     if( bank = AllocObject( IE_GADGETBANK )) {
  1548.         struct GadgetInfo  *gad;
  1549.  
  1550.         bank->Node.ln_Type |= GB_ATTACHED;
  1551.  
  1552.         EditGBank( bank );
  1553.  
  1554.         if(!( RetCode )) {
  1555.         FreeObject( bank, IE_GADGETBANK );
  1556.         Stat( CatCompArray[ MSG_ABORTED ].cca_Str, FALSE, 0 );
  1557.         return( TRUE );
  1558.         }
  1559.  
  1560.         AddTail(( struct List * )&IE.win_info->wi_GBanks, ( struct Node * )bank );
  1561.  
  1562.         IE.win_info->wi_NumGBanks += 1;
  1563.  
  1564.         for( gad = IE.win_info->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ )
  1565.         if( gad->g_flags2 & G_ATTIVO ) {
  1566.             struct BGadget *bg;
  1567.  
  1568.             if( bg = AllocObject( IE_BGADGET )) {
  1569.             bg->Gadget = gad;
  1570.             AddTail((struct List *)&bank->Gadgets, (struct Node *)bg );
  1571.             }
  1572.         }
  1573.  
  1574.         IE.flags &= ~SALVATO;
  1575.  
  1576.     } else
  1577.         Stat( CatCompArray[ ERR_NOMEMORY ].cca_Str, TRUE, 0 );
  1578.     }
  1579.  
  1580.     return( TRUE );
  1581. }
  1582. ///
  1583. /// Elimina
  1584. BOOL DelGBankMenued( void )
  1585. {
  1586.     struct GadgetBank  *bank;
  1587.  
  1588.     if( bank = GetGadgetBank() ) {
  1589.     struct GadgetInfo  *gad;
  1590.     struct BGadget     *bg;
  1591.  
  1592.     if(!( bank->Node.ln_Type & GB_ATTACHED ))
  1593.         AddGBank( bank );
  1594.  
  1595.     for( gad = IE.win_info->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ )
  1596.         if( gad->g_flags2 & G_ATTIVO ) {
  1597.         gad->g_flags2 &= ~G_ATTIVO;
  1598.         gad->g_flags2 |=  G_WAS_ACTIVE;
  1599.         }
  1600.  
  1601.     while( bg = RemTail(( struct List * )&bank->Gadgets )) {
  1602.         bg->Gadget->g_flags2 |= G_ATTIVO;
  1603.         FreeObject( bg, IE_BGADGET );
  1604.     }
  1605.  
  1606.     DelGadMenued();
  1607.  
  1608.     for( gad = IE.win_info->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ ) {
  1609.         gad->g_flags2 &= ~G_ATTIVO;
  1610.         if( gad->g_flags2 & G_WAS_ACTIVE ) {
  1611.         gad->g_flags2 |=  G_ATTIVO;
  1612.         gad->g_flags2 &= ~G_WAS_ACTIVE;
  1613.         }
  1614.     }
  1615.  
  1616.     Remove(( struct Node * )bank );
  1617.  
  1618.     FreeObject( bank, IE_GADGETBANK );
  1619.  
  1620.     IE.win_info->wi_NumGBanks -= 1;
  1621.  
  1622.     RinfrescaFinestra();
  1623.  
  1624.     IE.flags &= ~SALVATO;
  1625.     }
  1626.  
  1627.     return( TRUE );
  1628. }
  1629. ///
  1630. /// Mostra
  1631. BOOL EditGBankMenued( void )
  1632. {
  1633.     struct GadgetBank  *bank;
  1634.  
  1635.     if( bank = GetGadgetBank() ) {
  1636.  
  1637.     if( bank != (struct GadgetBank *)&NoneNode ) {
  1638.         if(!( bank->Node.ln_Type & GB_ATTACHED )) {
  1639.         AddGBank( bank );
  1640.  
  1641.         RifaiGadgets();
  1642.         RinfrescaFinestra();
  1643.         }
  1644.     }
  1645.     }
  1646.  
  1647.     return( TRUE );
  1648. }
  1649. ///
  1650. /// Nascondi
  1651. BOOL HideGBankMenued( void )
  1652. {
  1653.     struct GadgetBank  *bank;
  1654.  
  1655.     if( bank = GetGadgetBank() )
  1656.     if( bank != (struct GadgetBank *)&NoneNode ) {
  1657.         if( bank->Node.ln_Type & GB_ATTACHED ) {
  1658.  
  1659.         RemGBank( bank );
  1660.  
  1661.         RifaiGadgets();
  1662.         RinfrescaFinestra();
  1663.         }
  1664.     }
  1665.  
  1666.     return( TRUE );
  1667. }
  1668. ///
  1669. /// Parametri
  1670. BOOL ParamGBankMenued( void )
  1671. {
  1672.     struct GadgetBank  *bank;
  1673.  
  1674.     if( bank = GetGadgetBank() )
  1675.     if( bank != (struct GadgetBank *)&NoneNode )
  1676.         EditGBank( bank );
  1677.  
  1678.     return( TRUE );
  1679. }
  1680. ///
  1681. /// EditGBank
  1682. void EditGBank( struct GadgetBank *bank )
  1683. {
  1684.     ULONG   ret;
  1685.  
  1686.     LockAllWindows();
  1687.  
  1688.     LayoutWindow( GBankParamWTags );
  1689.     ret = OpenGBankParamWindow();
  1690.     PostOpenWindow( GBankParamWTags );
  1691.  
  1692.     if( ret )
  1693.     DisplayBeep( Scr );
  1694.     else {
  1695.  
  1696.     StringTag[1] = bank->Label;
  1697.     GT_SetGadgetAttrsA( GBankParamGadgets[ GD_GB_Lab ], GBankParamWnd,
  1698.                 NULL, (struct TagItem *)StringTag );
  1699.  
  1700.     buffer = ( bank->Node.ln_Type & GB_ONOPEN ) ? FALSE : TRUE;
  1701.     GB_ShowOnOpenKeyPressed();
  1702.  
  1703.     RetCode = FALSE;
  1704.  
  1705.     while( ReqHandle( GBankParamWnd, HandleGBankParamIDCMP ));
  1706.  
  1707.     if( RetCode ) {
  1708.  
  1709.         if( buffer )
  1710.         bank->Node.ln_Type |= GB_ONOPEN;
  1711.         else
  1712.         bank->Node.ln_Type &= ~GB_ONOPEN;
  1713.  
  1714.         strcpy( bank->Label, GetString( GBankParamGadgets[ GD_GB_Lab ] ));
  1715.  
  1716.         IE.flags &= ~SALVATO;
  1717.     }
  1718.     }
  1719.  
  1720.     CloseGBankParamWindow();
  1721.  
  1722.     UnlockAllWindows();
  1723. }
  1724.  
  1725. BOOL GBankParamVanillaKey( void )
  1726. {
  1727.     switch( GBankParamMsg.Code ) {
  1728.     case    13:
  1729.         return( GB_OkClicked() );
  1730.     case    27:
  1731.         return( GB_AnnullaClicked() );
  1732.     }
  1733.  
  1734.     return( TRUE );
  1735. }
  1736.  
  1737. BOOL GB_OkKeyPressed( void )
  1738. {
  1739.     return( GB_OkClicked() );
  1740. }
  1741.  
  1742. BOOL GB_AnnullaKeyPressed( void )
  1743. {
  1744.     return( GB_AnnullaClicked() );
  1745. }
  1746.  
  1747. BOOL GB_OkClicked( void )
  1748. {
  1749.     RetCode = TRUE;
  1750.  
  1751.     return( FALSE );
  1752. }
  1753.  
  1754. BOOL GB_AnnullaClicked( void )
  1755. {
  1756.     return( FALSE );
  1757. }
  1758.  
  1759. BOOL GB_ShowOnOpenKeyPressed( void )
  1760. {
  1761.     CheckedTag[1] = buffer ? FALSE : TRUE;
  1762.  
  1763.     GT_SetGadgetAttrsA( GBankParamGadgets[ GD_GB_ShowOnOpen ], GBankParamWnd,
  1764.             NULL, (struct TagItem *)CheckedTag );
  1765.  
  1766.     return( GB_ShowOnOpenClicked() );
  1767. }
  1768.  
  1769. BOOL GB_ShowOnOpenClicked( void )
  1770. {
  1771.     buffer = buffer ? FALSE : TRUE;
  1772.  
  1773.     return( TRUE );
  1774. }
  1775.  
  1776. BOOL GB_LabClicked( void )
  1777. {
  1778.     return( TRUE );
  1779. }
  1780. ///
  1781. /// GetGadgetBank
  1782. struct GadgetBank *GetGadgetBank( void )
  1783. {
  1784.     struct GadgetBank  *bank = NULL;
  1785.  
  1786.     AddHead(( struct List * )&IE.win_info->wi_GBanks, &NoneNode );
  1787.  
  1788.     if( ApriListaFin( CatCompArray[ REQ_GETGADGETBANK ].cca_Str, 0, &IE.win_info->wi_GBanks )) {
  1789.     int                 num;
  1790.     struct GadgetBank  *b;
  1791.  
  1792.     num = 0;
  1793.     b   = IE.win_info->wi_GBanks.mlh_Head;
  1794.     while( b->Node.ln_Succ ) {
  1795.         num += 1;
  1796.         b = b->Node.ln_Succ;
  1797.     }
  1798.  
  1799.     num = GestisciListaFin( EXIT, num );
  1800.     ChiudiListaFin();
  1801.  
  1802.     if( num >= 0 ) {
  1803.         ULONG   cnt;
  1804.  
  1805.         bank = (struct GadgetBank *)&IE.win_info->wi_GBanks.mlh_Head;
  1806.         for( cnt = 0; cnt <= num; cnt++ )
  1807.         bank = bank->Node.ln_Succ;
  1808.     }
  1809.     }
  1810.  
  1811.     RemHead(( struct List * )&IE.win_info->wi_GBanks );
  1812.  
  1813.     return( bank );
  1814. }
  1815. ///
  1816. /// RemGBank
  1817. void RemGBank( struct GadgetBank *bank )
  1818. {
  1819.     struct BGadget *bg;
  1820.  
  1821.     if(!( IE.win_info ))
  1822.     return;
  1823.  
  1824.     bank->Count = 0;
  1825.  
  1826.     for( bg = (struct BGadget *)bank->Gadgets.mlh_Head; bg->Succ; bg = bg->Succ ) {
  1827.     struct GadgetInfo  *gad;
  1828.     BOOL                ok = FALSE;
  1829.  
  1830.     /* check if the gadget still exists */
  1831.     for( gad = IE.win_info->wi_Gadgets.mlh_Head; gad->g_Node.ln_Succ; gad = gad->g_Node.ln_Succ )
  1832.         if( gad == bg->Gadget ) {
  1833.         ok = TRUE;
  1834.         break;
  1835.         }
  1836.  
  1837.     if( ok ) {
  1838.         Remove(( struct Node * )bg->Gadget );
  1839.         AddTail(( struct List * )&bank->Storage, ( struct Node * )bg->Gadget );
  1840.         bank->Count += 1;
  1841.  
  1842.         if( bg->Gadget->g_Kind < BOOLEAN )
  1843.         IE.win_info->wi_NumGads -= 1;
  1844.         else if( bg->Gadget->g_Kind == BOOLEAN )
  1845.         IE.win_info->wi_NumBools -= 1;
  1846.         else
  1847.         IE.win_info->wi_NumObjects -= 1;
  1848.  
  1849.     } else {
  1850.         struct BGadget *prev;
  1851.  
  1852.         prev = bg->Pred;
  1853.  
  1854.         Remove(( struct Node * )bg );
  1855.  
  1856.         FreeObject( bg, IE_BGADGET );
  1857.  
  1858.         bg = prev;
  1859.     }
  1860.     }
  1861.  
  1862.     bank->Node.ln_Type &= ~GB_ATTACHED;
  1863. }
  1864. ///
  1865. /// AddGBank
  1866. void AddGBank( struct GadgetBank *bank )
  1867. {
  1868.     struct GadgetInfo  *gad;
  1869.  
  1870.     while( gad = RemHead(( struct List * )&bank->Storage )) {
  1871.     AddTail(( struct List * )&IE.win_info->wi_Gadgets, ( struct Node * )gad );
  1872.  
  1873.     if( gad->g_Kind < BOOLEAN )
  1874.         IE.win_info->wi_NumGads += 1;
  1875.     else if( gad->g_Kind == BOOLEAN )
  1876.         IE.win_info->wi_NumBools += 1;
  1877.     else
  1878.         IE.win_info->wi_NumObjects += 1;
  1879.     }
  1880.  
  1881.     bank->Node.ln_Type |= GB_ATTACHED;
  1882. }
  1883. ///
  1884. /// DetacheGBanks
  1885. void DetacheGBanks( void )
  1886. {
  1887.     struct WindowInfo  *BackUp, *wnd;
  1888.  
  1889.     BackUp = IE.win_info;
  1890.  
  1891.     for( wnd = IE.win_list.mlh_Head; wnd->wi_succ; wnd = wnd->wi_succ ) {
  1892.     struct GadgetBank *bank;
  1893.  
  1894.     IE.win_info = wnd;
  1895.  
  1896.     for( bank = wnd->wi_GBanks.mlh_Head; bank->Node.ln_Succ; bank = bank->Node.ln_Succ ) {
  1897.         if( bank->Node.ln_Type & GB_ATTACHED ) {
  1898.         RemGBank( bank );
  1899.         bank->Node.ln_Type |= GB_REATTACH;
  1900.         }
  1901.  
  1902.         SistemaGadgetsFlags( &bank->Storage );
  1903.     }
  1904.  
  1905.     SistemaGadgetsFlags( &wnd->wi_Gadgets );
  1906.     }
  1907.  
  1908.     IE.win_info = BackUp;
  1909. }
  1910. ///
  1911. /// ReAttachGBanks
  1912. void ReAttachGBanks( void )
  1913. {
  1914.     struct WindowInfo  *BackUp, *wnd;
  1915.  
  1916.     BackUp = IE.win_info;
  1917.  
  1918.     for( wnd = IE.win_list.mlh_Head; wnd->wi_succ; wnd = wnd->wi_succ ) {
  1919.     struct GadgetBank *bank;
  1920.  
  1921.     IE.win_info = wnd;
  1922.  
  1923.     for( bank = wnd->wi_GBanks.mlh_Head; bank->Node.ln_Succ; bank = bank->Node.ln_Succ )
  1924.         if( bank->Node.ln_Type & GB_REATTACH ) {
  1925.         AddGBank( bank );
  1926.         bank->Node.ln_Type &= ~GB_REATTACH;
  1927.         }
  1928.     }
  1929.  
  1930.     IE.win_info = BackUp;
  1931. }
  1932. ///
  1933. /// EliminaGBanks
  1934. void EliminaGBanks( struct WindowInfo *wnd )
  1935. {
  1936.     struct GadgetBank  *bank;
  1937.  
  1938.     while( bank = RemTail(( struct List * )&wnd->wi_GBanks )) {
  1939.     struct GadgetInfo  *gad;
  1940.  
  1941.     RemGBank( bank );
  1942.  
  1943.     while( gad = RemTail(( struct List * )&bank->Storage ))
  1944.         AddTail(( struct List * )&wnd->wi_Gadgets, ( struct Node * )gad );
  1945.  
  1946.     FreeObject( bank, IE_GADGETBANK );
  1947.     }
  1948. }
  1949. ///
  1950.